/**
 * 格式化数字（补零）
 * @param n 数字
 * @param length 长度，默认2位
 */
const padNumber = (n: number, length = 2): string => {
  return `${n}`.padStart(length, '0');
};

/**
 * 格式化日期
 * @param date 日期对象或时间戳
 * @param format 格式化模板，默认 YYYY-MM-DD HH:mm:ss
 */
export const formatDate = (date: Date | number | string, format = 'YYYY-MM-DD HH:mm:ss'): string => {
  const d = new Date(date);
  const year = d.getFullYear();
  const month = d.getMonth() + 1;
  const day = d.getDate();
  const hour = d.getHours();
  const minute = d.getMinutes();
  const second = d.getSeconds();

  return format
    .replace(/YYYY/g, `${year}`)
    .replace(/MM/g, padNumber(month))
    .replace(/DD/g, padNumber(day))
    .replace(/HH/g, padNumber(hour))
    .replace(/mm/g, padNumber(minute))
    .replace(/ss/g, padNumber(second));
};

/**
 * 格式化数字（每三位加逗号）
 * @param num 数字
 */
export const formatNumber = (num: number | string): string => {
  return num.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ',');
};

/**
 * 格式化金额
 * @param amount 金额（分）
 * @param places 小数位数，默认2位
 */
export const formatAmount = (amount: number, places = 2): string => {
  const yuan = (amount / 100).toFixed(places);
  return formatNumber(yuan);
};

/**
 * 格式化手机号
 * @param phone 手机号
 */
export const formatPhone = (phone: string): string => {
  return phone.replace(/^(\d{3})\d{4}(\d{4})$/, '$1****$2');
};

/**
 * 格式化文件大小
 * @param size 文件大小（字节）
 */
export const formatFileSize = (size: number): string => {
  if (size < 1024) {
    return size + 'B';
  } else if (size < 1024 * 1024) {
    return (size / 1024).toFixed(2) + 'KB';
  } else if (size < 1024 * 1024 * 1024) {
    return (size / (1024 * 1024)).toFixed(2) + 'MB';
  } else {
    return (size / (1024 * 1024 * 1024)).toFixed(2) + 'GB';
  }
};

/**
 * 格式化身份证号（隐藏中间）
 * @param idCard 身份证号
 */
export const formatIdCard = (idCard: string): string => {
  return idCard.replace(/^(\d{6})\d{8}(\w{4})$/, '$1********$2');
};

/**
 * 格式化银行卡号（每4位加空格）
 * @param cardNo 银行卡号
 */
export const formatBankCard = (cardNo: string): string => {
  return cardNo.replace(/\s/g, '').replace(/(.{4})/g, '$1 ').trim();
};